package com.example.j280_webproject.day039.jdbc;

import com.example.j280_webproject.day039.pojo.Student038;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 此类实现了学生信息表的增加修改查询
 */
public class StudentJDBC {
    /**
     * 将提交的学生姓名和身份证号增加到学生信息表
     *
     * @param connection       数据库连接池
     * @param studentName      学生姓名
     * @param card             身份证号
     * @throws SQLException    SQL异常
     */
    public void insertStudent(Connection connection,String studentName , String card) throws SQLException {
        String sql = "insert into student038(studentName,card)values (?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,studentName);
        preparedStatement.setString(2,card);
        preparedStatement.execute();
        preparedStatement.close();
    }

    /**
     * 通过学生身份证号查询学生是否已存在，如果存在则返回学生的id，否则返回-1
     *
     * @param connection       数据库连接池
     * @param card             身份证号
     * @return                 返回一个int值
     * @throws SQLException    SQL异常
     */
    public int selectByCard(Connection connection, String card) throws SQLException {
        int id = -1;
        String sql = "select id,studentName from student038 where card=?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,card);
        ResultSet resultSet = preparedStatement.executeQuery();
        boolean action = resultSet.next();
        if (action){
            id = resultSet.getInt("id");
        }
        resultSet.close();
        preparedStatement.close();
        return id;
    }

    /**
     * 如果没有传递学生信息则查询所有学生信息，调用了fengzhuang方法，将查询到的学生信息通过pojo包的studentName类
     * 封装循环写入每条班级信息并写入到list集合当中，最后返回list集合
     *
     * @param connection       数据库连接池
     * @return                 返回一个list值
     * @throws SQLException    SQL异常
     */
    public List<com.example.j280_webproject.day039.pojo.Student038> selectStudentList(Connection connection) throws SQLException {
        String sql ="select id,studentName,class_id,card from student038";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        return fengzhuang(preparedStatement);
    }

    /**
     * 通过学生姓名模糊查询学生信息，调用了fengzhuang方法，将查询到的学生信息通过pojo包的studentName类
     * 封装循环写入每条班级信息并写入到list集合当中，最后返回list集合
     *
     * @param connection       数据库连接池
     * @param studentName      学生姓名
     * @return                 返回一个list值
     * @throws SQLException    SQL异常
     */
    public List<com.example.j280_webproject.day039.pojo.Student038> selectStudentListByStudentName(Connection connection,String studentName) throws SQLException {
        String sql ="select id,studentName,class_id,card from student038 where studentName like ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"%"+studentName+"%");
        return fengzhuang(preparedStatement);
    }

    /**
     * 通过学生身份证号模糊查询学生信息，调用了fengzhuang方法，将查询到的学生信息通过pojo包的studentName类
     * 封装循环写入每条班级信息并写入到list集合当中，最后返回list集合
     *
     * @param connection       数据库连接池
     * @param card             身份证号
     * @return                 返回一个list值
     * @throws SQLException    SQL异常
     */
    public List<com.example.j280_webproject.day039.pojo.Student038> selectStudentListByCard(Connection connection,String card) throws SQLException {
        String sql ="select id,studentName,class_id,card from student038 where card like ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"%"+card+"%");
        return fengzhuang(preparedStatement);
    }
    /**
     * 通过学生姓名和身份证号模糊查询学生信息，调用了fengzhuang方法，将查询到的学生信息通过pojo包的studentName类
     * 封装循环写入每条班级信息并写入到list集合当中，最后返回list集合
     *
     * @param connection       数据库连接池
     * @param studentName      学生姓名
     * @param card             身份证号
     * @return                 返回一个list值
     * @throws SQLException    SQL异常
     */
    public List<com.example.j280_webproject.day039.pojo.Student038> selectStudentListByStudentNameAndCard(Connection connection,String studentName,String card) throws SQLException {
        String sql ="select id,studentName,class_id,card from student038 where studentName like ? and card like ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"%"+studentName+"%");
        preparedStatement.setString(2,"%"+card+"%");
        return fengzhuang(preparedStatement);
    }

    /**
     * 通过学生id和班级id修改学生表中的班级信息
     *
     * @param connection       数据库连接池
     * @param id               学生id
     * @param class_id         班级id
     * @throws SQLException    SQL异常
     */
    public void updateById(Connection connection,int id ,int class_id) throws SQLException {
        String sql ="update student038 set class_id = ? where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,class_id);
        preparedStatement.setInt(2,id);
        preparedStatement.execute();
        preparedStatement.close();
    }

    /**
     * 此方法封装了查询的数据并返回给list集合
     *
     * @param preparedStatement      预处理执行集
     * @return                       返回list集合
     * @throws SQLException          SQL异常
     */
    private List<com.example.j280_webproject.day039.pojo.Student038> fengzhuang(PreparedStatement preparedStatement) throws SQLException {
        ResultSet resultSet = preparedStatement.executeQuery();
        com.example.j280_webproject.day039.pojo.Student038 myStudent = null;                     //创建myStudent对象初始化为null
        List<com.example.j280_webproject.day039.pojo.Student038> list = new ArrayList<>();
        while (resultSet.next()){                                                                //当有下一条数据resultSet.next()为true
            myStudent = new com.example.j280_webproject.day039.pojo.Student038();                //创建一个新的对象地址来指向对应需要封装的值
            myStudent.id = resultSet.getInt("id");                                  //结果集调用getInt方法过去字段id的值传递给myStudent.id
            myStudent.studentName = resultSet.getString("studentName");             //结果集调用getString方法过去字段studentName的值传递给myStudent.studentName
            myStudent.calss_id = resultSet.getInt("class_id");                      //结果集调用getInt方法过去字段calss_id的值传递给myStudent.calss_id
            myStudent.card = resultSet.getString("card");                           //结果集调用getString方法过去字段card的值传递给myStudent.card
            list.add(myStudent);                                                                //将myStudent对象按顺序添加到list集合中
        }
        return list;                                                                            //返回list集合
    }
}
